// trajectory n.轨道，轨迹

// 导入 Cesium 库的所有模块，并将其命名为 'Cesium'。
import * as Cesium from "cesium";

// 计算总时间和每个点位的时间数组
// 返回总时间和每个点位的时间数组
// pArr:一个多线段每个点组成的笛卡尔坐标数组
// speed:车辆行驶的速度（它是一个常量）
const getSiteTimes = (pArr, speed) => {
  let timeSum = 0,
    times = [];

  for (var i = 0; i < pArr.length; i++) {
    if (i == 0) {
      times.push(0); // 第0个时间为0
      continue;
    }

    // 计算两点之间的空间距离，并根据速度计算时间
    timeSum += spaceDistance([pArr[i - 1], pArr[i]]) / speed;
    times.push(timeSum);
  }

  return {
    timeSum: timeSum, // 总时间
    siteTimes: times, // 到达每一个站点的时间点组成的数组(times[0]从0开始)
  };
};

// 计算多点组成的polyline的空间距离
// 返回距离值（以m为单位）
//positions：应为一个笛卡尔坐标数组
// 此处我们只用它来计算两个点之间的距离即可。
const spaceDistance = (positions) => {
  let distance = 0;

  for (let i = 0; i < positions.length - 1; i++) {
    // 使用 Cesium 提供的方法计算两个点之间的距离
    let s = Cesium.Cartesian3.distance(positions[i], positions[i + 1]);
    distance = distance + s;
  }

  return distance.toFixed(2); // 距离的值，以m为单位
};

// 获取飞行动画的点位：
// （返回一个存储了每个点位（JulianDate时间和笛卡尔坐标）的SampledPositionProperty 对象）
// pArr:plyline的每个点笛卡尔坐标组成的数组
// startTime：一个JulianDate对象，表示起始的JulianDate
// siteTimes: 到达每一个站点的时间点组成的数组（siteTimes从0开始）
const computeCirclularFlight = (pArr, startTime, siteTimes) => {
  // 创建一个 SampledPositionProperty 对象，用于存储飞行动画的位置信息
  let property = new Cesium.SampledPositionProperty();
  // SampledPositionProperty是一个 SampledProperty 也是一个 PositionProperty
  for (var i = 0; i < pArr.length; i++) {
    // 计算每个点位的朱力文时间，并使用 SampledPositionProperty 添加样本
    const time = Cesium.JulianDate.addSeconds(
      startTime,
      siteTimes[i], // 从startTime开始，持续的时间（以秒为单位）
      new Cesium.JulianDate() // 一个可选的结果参数（如果未提供，则创建新的JulianDate）
    );
    // Cesium.JulianDate.addSeconds返回一个新的JulianDate对象，
    // 表示在一个起始的JulianDate对象上增加了一段时间（以秒为单位）后，生成一个新的JulianDate
    // 把每个点的JulianDate时间和位置信息（此处为笛卡尔坐标）存储在SampledPositionProperty 对象中
    // property.addSample（JulianDate时间，笛卡尔坐标）
    property.addSample(time, pArr[i]);
  }

  return property;
  // 返回存储了每个点位（JulianDate时间和笛卡尔坐标）的SampledPositionProperty 对象
};

// 导出 getSiteTimes 和 computeCirclularFlight 函数，使其在其他文件中可用
export { getSiteTimes, computeCirclularFlight, spaceDistance };
